#include<unistd.h>
#include<string.h>
#include<assert.h>
#include<string>
using namespace std;
class String
{
  public:
    String(const char* tmp="")
    {
      if(tmp==NULL)
      {
        assert(false);
        return;
      }
      _ret=new char[strlen(tmp)+1];
      strcpy(_ret,tmp);
    }
    String(const String& s)
      :_ret(new char[strlen(s._ret)+1])
    {
      strcpy(_ret,s._ret);          
    }
    /*
    String& operator=(String& x)
    {
      swap(_ret,x._ret);
      return *this;
    }*/
    String& operator=(const String& x)
    {
      if(this!=&x)
      {
        String strtmp(x);
        swap(_ret,strtmp._ret);
      }
      return *this;
    }

    ~String()
    {
      if(_ret)
      {
        delete[] _ret;
        _ret=NULL;
      }
    }


  private:
    char* _ret;

};
int main()
{
  String s1("haha");
  String s2(s1);
  return 0;
}
